package futbol.tacticas.concursantes2007.SeteTeam.jugadores.facklab;

import futbol.tacticas.concursantes2007.SeteTeam.jugadores.AbstractTacticaJugador;

import java.awt.Point;
import java.util.Vector;

import futbol.tacticas.Comando;


/**
 * Los centrales junto con uno de los delanteros se encargan de mover el 
 * balon en el ataque, tienen que ser los jugadores mas habiles del 
 * equipo. 
 * 
 * @author Sete
 *
 */
public class TacticaCentroMedioAlto  extends AbstractTacticaJugador{
	
	public TacticaCentroMedioAlto(int xInicial, int yInicial, int fuerza, final Entrenador entrenador) {
		super(Entrenador.CEN_MED_ALTO, xInicial, yInicial, fuerza, entrenador);
	}
	
	protected Point EvaluacionLinealVertical(Point A, Point B, int D) {
		Point Solucion = B;
		Point Auxiliar;
		
		for (int i=-D;i<=D;i++){
			Auxiliar = new Point((int)B.getX(),i);
			if (Densidad_Jugadores(Solucion, A)>Densidad_Jugadores(Auxiliar, A)){
				Solucion = new Point(Auxiliar);;
			}
		}		
		return Solucion;
	}

	protected void generarMovimientoOfensivo(final Vector<Comando> comandos){
		
		final Point bola = getSituacion().getBola();
		final Point A = new Point(50,-80);
		final Point B = new Point(100,80);
		
		if (bola.getX()>A.x && bola.getX()<B.x && bola.getY()>A.y && bola.getY()<B.y ){
			comandos.add(irA(bola.x, bola.y));
		}else{

			Point P = new Point(heuristicaMovimiento(A,B));
			comandos.add(irA(P.x,P.y));
		}		
	}
	
	protected void generarMovimientoDefensivo(final Vector<Comando> comandos){
		final Point bola=getSituacion().getBola();
		int D = 50; // Desplazamiento
		int distanciaBalon = 60; // Distancia a la que se mantendra del balon
		
		Point P = new Point((int)bola.getX()+distanciaBalon,+D); // Punto central
		Point B = new Point(bola);
	
		Point O = EvaluacionLinealVertical(B,P,D);
		//if (O.getY()<0) O = new Point(O.x,0);
		comandos.add(irA(O.getX(), O.getY()));

	}

	protected void generarMovimiento(final Vector<Comando> comandos) {
		if (getPosicion().distance(getSituacion().getBola())<30){
			Point O = new Point(getSituacion().getBola());
			comandos.add(irA(O.x, O.y));
		}else{
			if (getSituacion().getBola().getX()>0){
				generarMovimientoOfensivo(comandos);
			}else{
				generarMovimientoDefensivo(comandos);
			}
		}
	}

	protected void generarAccionDefensiva(final Vector<Comando> comandos) {
		int Alto  = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_ALTO]); 
		int Medio = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_MED_BAJO]); 
		int Bajo  = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_BAJO]); 
		int Centro= Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.DEL_BAJO]); 

		Comando temp = tiroAPuerta(0);
		if ((Alto  <= Medio) && (Alto <= Bajo) && (Alto <= Centro)) temp = pase(Entrenador.CEN_ALTO);
		if ((Medio <= Alto ) && (Medio<= Bajo) && (Medio<= Centro)) temp = pase(Entrenador.CEN_MED_BAJO);
		if ((Bajo  <= Medio) && (Bajo <= Alto) && (Bajo <= Centro)) temp = pase(Entrenador.CEN_BAJO);
		if ((Centro<= Medio) && (Centro<= Alto)&& (Centro <= Bajo)) temp = pase(Entrenador.DEL_BAJO);

		comandos.add(temp);
	}
		
	protected void generarAccion(final Vector<Comando> comandos) {
		if (getSituacion().getBola().getX()>0){
			comandos.add(this.tiroAPuertaPreciso());
		}else{
			generarAccionDefensiva(comandos);
		}
	}

}
